﻿using System;
using System.Drawing;
using System.Windows.Forms;
using System.Xml;
using System.Collections.Generic;
using Engine;
using Library;
using MyControls;
using Gencode;

namespace GameTool
{
    public partial class SapXep_Form1 : Form
    {
        #region Declare variables
        public MainForm mainForm;
        private int _currentPage = 0;//trang hiện tại; trang đánh số bắt đầu từ 0
        private int _soDongTrenTrang = 5;//số dòng trên một trang
        private int _soPTTrenDong = 2;//số item trên một dòng
        private List<SCom> _component = null;
        public List<SCom> Components
        {
            set { _component = value; }
            get
            {
                if(_component == null)
                    _component = new List<SCom>();
                this.txtCounter.Text = this._component.Count.ToString();
                this.txtPage.Text = (this._currentPage + 1).ToString();
                return _component;
            }
        }

        private Button[] addButton;
        private Button[] delButton;

        private char _hash = ';';//ký tự phân cách dùng để băm trong trường hợp nhập nhanh

        #endregion

        #region User's methods

        /// <summary>
        /// Đổ dữ liệu vào các combobox
        /// </summary>$
        private void InitData()
        {
            try
            {
                foreach (ClassInfo c in Common.ClassList)
                {
                    if (User.CheckPermission(c.Name))
                    {
                        cmbLop.Items.AddRange(new object[] { "lop" + c.Name });
                    }
                }
                if (cmbLop.Items.Count > 0)
                {
                    cmbLop.SelectedIndex = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void LoadXML(string url, string filename)
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();

                ftp_main.download(url, filename);
                xDoc.Load(filename);

                this.cmbLop.Text = SapXep_Form2.Instance.Lop;
                this.cmbVong.Text = SapXep_Form2.Instance.Vong;
                // Parser File Xml.
                XmlNodeList code = xDoc.GetElementsByTagName("code");
                string codeString = code[0].InnerText;
                this.txtBaiThiSo.Text = codeString;

                XmlNodeList subject = xDoc.GetElementsByTagName("subject");
                string subjectString = subject[0].InnerText;
                this.txtTenBaiThi.Text = subjectString;

                XmlNodeList time = xDoc.GetElementsByTagName("time");
                string timeString = time[0].InnerText;
                this.nUDThoiGian.Value = Int32.Parse(timeString);

                XmlNodeList rule = xDoc.GetElementsByTagName("rule");
                string ruleString = rule[0].InnerText;
                this.txtDeBai.Text = ruleString;

                XmlNodeList pointNode = xDoc.GetElementsByTagName("point");
                string point = pointNode[0].InnerText;
                this.nUDDiem.Value = Int32.Parse(point);

                XmlNodeList giftPointNode = xDoc.GetElementsByTagName("giftPoint");
                string giftPoint = giftPointNode[0].InnerText;
                this.nUDDiemThuong.Value = Int32.Parse(giftPoint);

                XmlNodeList numRow = xDoc.GetElementsByTagName("numRow");
                string numRowString = numRow[0].InnerText;
                this.nUDSoDong.Value = Convert.ToByte(numRowString);

                XmlNodeList numCol = xDoc.GetElementsByTagName("numCol");
                string numColString = numCol[0].InnerText;
                this.nUDSoCot.Value = Convert.ToByte(numColString);

                XmlNodeList maxErrorNode = xDoc.GetElementsByTagName("maxerror");
                string maxError = maxErrorNode[0].InnerText;
                this.nUDSoLoi.Value = Convert.ToByte(maxError);

                XmlNodeList numLevel1Node = xDoc.GetElementsByTagName("numLevel1");
                string numLevel1 = numLevel1Node[0].InnerText;
                if (numLevel1.Length > 0)
                    this.nUDDe.Value = Convert.ToByte(numLevel1);
                else
                    this.nUDDe.Value = 0;

                XmlNodeList numLevel2Node = xDoc.GetElementsByTagName("numLevel2");
                string numLevel2 = numLevel2Node[0].InnerText;
                if (numLevel2.Length > 0)
                    this.nUDBinhThuong.Value = Convert.ToByte(numLevel2);
                else
                    this.nUDBinhThuong.Value = 0;

                XmlNodeList numLevel3Node = xDoc.GetElementsByTagName("numLevel3");
                string numLevel3 = numLevel3Node[0].InnerText;
                if (numLevel3.Length > 0)
                    this.nUDKho.Value = Convert.ToByte(numLevel3);
                else
                    this.nUDKho.Value = 0;
                // Dua cac thong tin ve cau hoi
                XmlNodeList numQuestions = xDoc.GetElementsByTagName("question");

                for (int i = 0; i < numQuestions.Count; i++)
                {
                    string fileimage = numQuestions[i].InnerText;
                    XmlAttributeCollection attr = numQuestions[i].Attributes;
                    int level = System.Convert.ToInt32(attr[0].Value);

                    Bitmap image = new Bitmap(ftp_main.GetPicture(GetImagePath() + "\\" + cmbVong.Text, fileimage));
                    SCom com = new SCom(level, fileimage, image);
                    AddCom(com, i);
                }
                //SELECT();
                ShowCom(0);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }        

        /// <summary>
        /// Hiển thị các component
        /// </summary>
        private void ShowCom(int trang)
        {
            try
            {
                VisiableButton();
                int _soPTTrenTrang = _soDongTrenTrang * _soPTTrenDong;
                int _start = trang * _soPTTrenTrang;//vị trí bắt đầu show
                int _end = (trang * _soPTTrenTrang) + (_soPTTrenTrang - 1);//vị trí end show
                if (_end >= Components.Count)
                {
                    _end = Components.Count - 1;
                }
                int _x = 50;
                int _y = 0;
                int curx = _x;
                int cury = _y;
                int counter = 0;
                for (int i = _start; i <= _end; i++)
                {
                    Components[i].BringToFront();
                    Components[i].PT = "PT" + (i + 1).ToString();
                    Components[i].Visible = true;
                    Components[i].Location = new Point(curx, cury);
                    this.addButton[i % _soPTTrenTrang].Visible = true;
                    this.addButton[i % _soPTTrenTrang].Location = new Point(curx + Components[i].Width, cury + 25);
                    this.delButton[i % _soPTTrenTrang].Visible = true;
                    this.delButton[i % _soPTTrenTrang].Location = new Point(curx + Components[i].Width, cury + 52);
                    curx += Components[i].Width + 70;
                    counter++;
                    if (counter == _soPTTrenDong)
                    {
                        curx = _x;
                        cury += Components[i].Height + 5;
                        counter = 0;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Ẩn các component
        /// </summary>
        /// <param name="trang"></param>
        private void HideCom(int trang)
        {
            try
            {
                int _soPTTrenTrang = _soDongTrenTrang * _soPTTrenDong;
                int _start = trang * _soPTTrenTrang;//vị trí bắt đầu show
                int _end = (trang * _soPTTrenTrang) + (_soPTTrenTrang - 1);//vị trí end show
                if (_end >= Components.Count)
                {
                    _end = Components.Count - 1;
                }
                for (int i = _start; i <= _end; i++)
                {
                    Components[i].Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Thêm component
        /// </summary>
        /// <param name="com">Component cần thêm</param>
        /// <param name="index">Vị trí thêm</param>
        private void AddCom(SCom com, int index)
        {
            try
            {
                com.Visible = false;
                Components.Insert(index, com);
                this.pnlQuestion.Controls.Add(com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Xóa component
        /// </summary>
        /// <param name="index">Vị trí cần xóa</param>
        private void DelCom(int index)
        {
            try
            {
                this.pnlQuestion.Controls.Remove(Components[index]);
                Components.RemoveAt(index);
                if (_currentPage * _soPTTrenDong * _soDongTrenTrang >= Components.Count)
                    _currentPage--;
                if (_currentPage < 0)
                    _currentPage = 0;

                #region Focus
                if(-1 <index && index < Components.Count)
                {
                    Components[index].Focus();
                }
                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Make danh sách các button thêm component và xóa component
        /// </summary>
        private void Init()
        {
            try
            {
                addButton = new Button[_soDongTrenTrang*_soPTTrenDong];
                delButton = new Button[_soDongTrenTrang*_soPTTrenDong];
                for (int i = 0; i < addButton.Length; i++)
                {
                    this.addButton[i] = new Button();
                    this.addButton[i].Text = "Thêm";
                    this.addButton[i].Name = i.ToString();
                    this.addButton[i].Size = new Size(47, 23);
                    this.addButton[i].Click += new EventHandler(cmdAdd_Click);
                    this.pnlQuestion.Controls.Add(this.addButton[i]);
                    this.addButton[i].Visible = false;

                    this.delButton[i] = new Button();
                    this.delButton[i].Text = "Xóa";
                    this.delButton[i].Name = i.ToString();
                    this.delButton[i].Size = new Size(47, 23);
                    this.delButton[i].Click += new EventHandler(cmdDel_Click);
                    this.pnlQuestion.Controls.Add(this.delButton[i]);
                    this.delButton[i].Visible = false;
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Ẩn các button thêm và xóa component
        /// </summary>
        private void VisiableButton()
        {
            try
            {
                for (int i = 0; i < addButton.Length; i++)
                {
                    this.addButton[i].Visible = false;
                    this.delButton[i].Visible = false;
                }

                cmdAddNormal.Visible = (_currentPage == 0);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Đẩy dữ liệu lên server
        /// </summary>
        /// <returns></returns>
        private string UploadXML()
        {
            string result = string.Empty;
            try
            {
                XmlDocument doc = new XmlDocument();
                XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc.AppendChild(docNode);
                XmlNode examinateNode = doc.CreateElement("examinate");
                doc.AppendChild(examinateNode);

                XmlNode codeNode = doc.CreateElement("code");
                codeNode.AppendChild(doc.CreateTextNode(this.txtBaiThiSo.Text));
                examinateNode.AppendChild(codeNode);

                XmlNode nameNode = doc.CreateElement("subject");
                nameNode.AppendChild(doc.CreateTextNode(this.txtTenBaiThi.Text.Trim()));
                examinateNode.AppendChild(nameNode);

                XmlNode timeNode = doc.CreateElement("time");
                timeNode.AppendChild(doc.CreateTextNode(this.nUDThoiGian.Value.ToString()));
                examinateNode.AppendChild(timeNode);

                XmlNode subjectNode = doc.CreateElement("rule");
                subjectNode.AppendChild(doc.CreateTextNode(this.txtDeBai.Text.Trim()));
                examinateNode.AppendChild(subjectNode);

                XmlNode pointNode = doc.CreateElement("point");
                pointNode.AppendChild(doc.CreateTextNode(this.nUDDiem.Value.ToString()));
                examinateNode.AppendChild(pointNode);

                XmlNode giftNode = doc.CreateElement("giftPoint");
                giftNode.AppendChild(doc.CreateTextNode(this.nUDDiemThuong.Value.ToString()));
                examinateNode.AppendChild(giftNode);

                XmlNode rowNode = doc.CreateElement("numRow");
                rowNode.AppendChild(doc.CreateTextNode(this.nUDSoDong.Value.ToString()));
                examinateNode.AppendChild(rowNode);

                XmlNode colNode = doc.CreateElement("numCol");
                colNode.AppendChild(doc.CreateTextNode(this.nUDSoCot.Value.ToString()));
                examinateNode.AppendChild(colNode);

                // Tao so loi toi da
                XmlNode maxErrorNode = doc.CreateElement("maxerror");
                maxErrorNode.AppendChild(doc.CreateTextNode(this.nUDSoLoi.Value.ToString()));
                examinateNode.AppendChild(maxErrorNode);

                // Tao ra so cau hoi muc 1
                XmlNode numLevel1 = doc.CreateElement("numLevel1");
                numLevel1.AppendChild(doc.CreateTextNode(this.nUDDe.Value.ToString()));
                examinateNode.AppendChild(numLevel1);

                // Tao ra so cau hoi muc 2
                XmlNode numLevel2 = doc.CreateElement("numLevel2");
                numLevel2.AppendChild(doc.CreateTextNode(this.nUDBinhThuong.Value.ToString()));
                examinateNode.AppendChild(numLevel2);

                // Tao ra so cau hoi muc 3
                XmlNode numLevel3 = doc.CreateElement("numLevel3");
                numLevel3.AppendChild(doc.CreateTextNode(this.nUDKho.Value.ToString()));
                examinateNode.AppendChild(numLevel3);

                XmlNode questionsNode = doc.CreateElement("questions");
                examinateNode.AppendChild(questionsNode);

                for (int i = 0; i < this.Components.Count; i++)
                {
                    // Tao ra mot question node
                    XmlNode questionNode = doc.CreateElement("question");
                    // Tao Attribute
                    XmlAttribute attr = doc.CreateAttribute("level");
                    attr.Value = this.Components[i].Level.ToString();
                    questionNode.Attributes.Append(attr);

                    this.Components[i].MyCapture(int.Parse(cmbLop.Text.Substring(3, cmbLop.Text.Length - 3)));
                    string fileName = this.Components[i].FileName;
                    questionNode.AppendChild(doc.CreateTextNode(fileName));
                    questionsNode.AppendChild(questionNode);

                    string pathName = this.Components[i].FullPath;
                    if (this.Components[i].Modify)
                    {
                        UploadFile.UpFtpFile(GetImagePath(), cmbVong.Text, fileName, pathName);
                    }
                }

                string xmlFile = "1.xml";
                doc.Save(xmlFile);
                UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text, xmlFile, xmlFile);
                System.IO.File.Delete(xmlFile);
                INSERT();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return result;
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu đầu vào trước khi lưu
        /// </summary>
        /// <returns>Thông điệp trả về: thông điệp trắng là hợp lệ</returns>
        private string ValidateInput()
        {
            string _mess = string.Empty;
            try
            {
                if (!chkViolympic.Checked && !chkViSchool.Checked && !chkViother.Checked)
                {
                    _mess = "Bạn chưa chọn nhập liệu cho chương trình nào.";
                    chkViolympic.Focus();
                    return _mess;
                }
                if (cmbLop.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn lớp.";
                    cmbLop.DroppedDown = true;
                    cmbLop.Focus();
                    return _mess;
                }
                if (cmbVong.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn Vòng.";
                    cmbVong.DroppedDown = true;
                    cmbVong.Focus();
                    return _mess;
                }

                int _totalQuestion = (int)(nUDDe.Value + nUDBinhThuong.Value + nUDKho.Value);
                if (_totalQuestion == 0)
                {
                    _mess = "dễ + bình thường + khó > 0.";
                    nUDDe.Focus();
                    return _mess;
                }

                if (nUDSoDong.Value * nUDSoCot.Value != nUDDe.Value + nUDBinhThuong.Value + nUDKho.Value)
                {
                    _mess =
                        "Dữ liệu không hợp lý.\n(Số dòng x số cột) phải bằng (Số câu dễ + số câu bình thường + số câu khó)";
                    nUDSoDong.Focus();
                    return _mess;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            
            return _mess;
        }

        private string Warning()
        {
            string _mess = string.Empty;
            try
            {
                int _e = 0;
                int _m = 0;
                int _h = 0;
                foreach (SCom sCom in Components)
                {
                    switch (sCom.Level)
                    {
                        case 0:
                            _e++;
                            break;
                        case 1:
                            _m++;
                            break;
                        case 2:
                            _h++;
                            break;
                    }
                }
                if(_e < nUDDe.Value)
                {
                    if(_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu dễ chưa đủ";
                }
                
                if (_m < nUDBinhThuong.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu tb chưa đủ";
                }

                if (_h < nUDKho.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu khó chưa đủ";
                }

                if (_mess.Length > 0)
                    _mess += "\nđể game chạy!";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return _mess;
        }

        /// <summary>
        /// Lấy vị trí cần lưu file xml trên server
        /// </summary>
        /// <returns></returns>
        private string GetXMLPath()
        {
            return Common.config.pathXml + "\\" + cmbLop.Text + "\\Game1";
        }

        /// <summary>
        /// Lấy vị trí lưu file ảnh trên server
        /// </summary>
        /// <returns></returns>
        private string GetImagePath()
        {
            return Common.config.pathImage + "\\" + cmbLop.Text + "\\Game1";
        }

        /// <summary>
        /// Reset các control về giá trị ban đầu.
        /// </summary>
        private void Reset()
        {
            try
            {
                chkViother.Checked = chkViSchool.Checked = !(chkViolympic.Checked = true);
                if (cmbLop.Items.Count > 0)
                    cmbLop.SelectedIndex = 0;
                cmbVong.SelectedIndex = -1;
                nUDSoDong.Value = nUDSoDong.Minimum;
                nUDSoCot.Value = nUDSoCot.Minimum;
                nUDThoiGian.Value = nUDThoiGian.Minimum;
                nUDDe.Value = nUDDe.Minimum;
                nUDBinhThuong.Value = nUDBinhThuong.Minimum;
                nUDKho.Value = nUDKho.Minimum;
                nUDDiem.Value = nUDDiem.Minimum;
                nUDSoLoi.Value = nUDSoLoi.Minimum;
                nUDDiemThuong.Value = nUDDiemThuong.Minimum;
                txtBaiThiSo.Clear();
                txtTenBaiThi.Clear();
                txtDeBai.Clear();
                pnlQuestion.Visible = true;
                
                while (this.Components.Count > 0)
                {
                    this.DelCom(0);
                }
                this.VisiableButton();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        #endregion

        #region Constructors
        public SapXep_Form1()
        {
            InitializeComponent();
            Init();
        }
        #endregion

        #region Events

        private void SapXep_Form1_FormClosing(object sender, FormClosingEventArgs e)
        {

        }

        private void Review_Click(object sender, EventArgs e)
        {
            DialogResult _dialogResult =
                    MessageBox.Show(
                        "Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn xem đề?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (_dialogResult == System.Windows.Forms.DialogResult.No)
                return;
            try
            {
                SapXep_Form2.Instance.ShowDialog();
                string lop = SapXep_Form2.Instance.Lop;
                string vong = SapXep_Form2.Instance.Vong;
                String url = Common.config.pathXml + "\\" + lop + "\\Game1\\" + vong;
                if (lop.Length > 0 && vong.Length > 0)
                {
                    #region Reset
                    pnlQuestion.Visible = true;
                    VisiableButton();
                    while (Components.Count > 0)
                    {
                        DelCom(0);
                    }
                    _currentPage = 0;
                    #endregion
                    LoadXML(url, "1.xml");
                }
                SapXep_Form2.Instance.Vong = SapXep_Form2.Instance.Lop = string.Empty;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdAddNormal_Click(object sender, EventArgs e)
        {
            try
            {
                SCom com = new SCom();
                AddCom(com, 0);
                ShowCom(0);
                com.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdAdd_Click(object sender, EventArgs e)
        {
            try
            {
                SCom com = new SCom();
                string name = ((Button)sender).Name;
                int idx = System.Convert.ToInt32(name);
                int cur = idx + _currentPage * _soDongTrenTrang * _soPTTrenDong + 1;
                AddCom(com, cur);
                if (idx == addButton.Length - 1)//nếu là nút cuối cùng trong dãy thì sang trang
                {
                    HideCom(_currentPage);
                    _currentPage++;
                }
                ShowCom(_currentPage);
                com.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdDel_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult = MessageBox.Show("Xóa phần tử này?", "Xac nhan thao tac",
                                                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if(_dialogResult == DialogResult.No)
                {
                    return;
                }
                string name = ((Button)sender).Name;
                int idx = System.Convert.ToInt32(name);
                int cur = idx + _currentPage * _soDongTrenTrang * _soPTTrenDong;

                DelCom(cur);
                ShowCom(_currentPage);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void PrePage_Click(object sender, EventArgs e)
        {
            try
            {
                if (_currentPage > 0)
                {
                    HideCom(_currentPage);
                    _currentPage--;
                    ShowCom(_currentPage);
                }
                else
                {
                    cmdAddNormal.Visible = true;
                    MessageBox.Show("Đang ở trang đầu tiên!", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void NextPage_Click(object sender, EventArgs e)
        {
            try
            {
                int _totalPage = (Components.Count) / (_soDongTrenTrang * _soPTTrenDong);
                if ((Components.Count) % (_soDongTrenTrang * _soPTTrenDong) > 0)
                    _totalPage++;
                if (_currentPage < _totalPage - 1)
                {
                    HideCom(_currentPage);
                    _currentPage++;
                    ShowCom(_currentPage);
                }
                else
                {
                    MessageBox.Show("Đang ở trang cuối cùng!", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void Upload_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult;
                string _mess;
                #region Validate?
                _mess = ValidateInput();
                if (_mess.Length > 0)
                {
                    _mess += "\nVui lòng kiểm tra lại!";
                    MessageBox.Show(_mess, "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                #endregion
                #region Exists?
                bool _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong.Text, "1.xml");
                if(_exists)
                {
                    _dialogResult = MessageBox.Show("Đề bài của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if(_dialogResult == DialogResult.No)
                    {
                        return;
                    }
                }
                #endregion
                #region Warning
                _mess = Warning();
                if (_mess.Length > 0)
                {
                    _mess += "\nBạn có muốn tải lên server?";
                    _dialogResult = MessageBox.Show(_mess, "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if(_dialogResult == DialogResult.No)
                    {
                        return;
                    }
                }
                #endregion
                string result = UploadXML();
                if (result.Length > 0)
                {
                    MessageBox.Show(result);
                }
                else
                {
                    Common.LogAction(Library.Action.Update);
                    MessageBox.Show("Tải đề lên server thành công!", "Thong bao", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void SapXep_Form1_Load(object sender, EventArgs e)
        {
            InitData();
            pnlQuestion.Visible = false;
        }

        private void cmbLop_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cmbVong.Items.Clear();
                foreach (RoundInfo roundInfo in Common.RoundList[cmbLop.SelectedIndex])
                {
                    this.cmbVong.Items.AddRange(new object[] { "level" + roundInfo.RoundNumber });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdTaoDeMoi_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult =
                    MessageBox.Show("Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn tạo mới?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (_dialogResult == DialogResult.Yes)
                    Reset();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        #endregion

        #region Access to database
        private void INSERT()
        {
            GameQuestion insertDataBase = new GameQuestion();
            GameQuestionInfo gameInfo = new GameQuestionInfo();
            gameInfo.ClassID = ((ClassInfo)Common.ClassList[cmbLop.SelectedIndex]).ID;
            gameInfo.CodeName = this.txtBaiThiSo.Text;
            gameInfo.Description = this.txtDeBai.Text;            
            gameInfo.GameID = 1;
            gameInfo.QuestionID = 1;
            gameInfo.SubjectID = 1;
            gameInfo.Round = ((RoundInfo)Common.RoundList[cmbLop.SelectedIndex][cmbVong.SelectedIndex]).RoundNumber;
            gameInfo.RoundID = ((RoundInfo)Common.RoundList[cmbLop.SelectedIndex][cmbVong.SelectedIndex]).ID;
            gameInfo.Type = 0;
            insertDataBase.Insert(gameInfo);
        }
        #endregion

        private void cmdNhapNhanh_Click(object sender, EventArgs e)
        {
            txtNhapNhanh.Text = txtNhapNhanh.Text.Trim();
            if(txtNhapNhanh.Text.Length == 0 || txtNhapNhanh.Text.IndexOf(_hash) == 0)
            {
                return;
            }

            string[] _questionList = this.txtNhapNhanh.Text.Split(_hash);
            int _idx = (int)nudIdx.Value;
            if (_idx > Components.Count)
                _idx = Components.Count;
            //int _level = 0;
            //if (0 < _idx)
            //    _level = Components[_idx - 1].Level;
            for (int i = 0; i < _questionList.Length; i++)
            {
                SCom _com = new SCom();
                //_com.Level = _level;
                _com.MyText = _questionList[i].Trim();
                AddCom(_com, _idx);
                ShowCom(0);
                _com.Focus();
                _idx++;
            }
            txtNhapNhanh.Clear();
        }
    }
}